package com.zw.a.basic.a13.demo01_thread;

//案例: 演示多线程的实现方式一: 继承Thread类.
/*
    多线程的实现方式:
        方式一:  继承Thread类.
            1. 定义一个类(MyThread), 继承Thread类.
            2. 重写Thread#run()方法.
            3. 把要执行的代码放到run()方法中.
            4. 开启线程.

        方式二: 实现Runnable接口.

        方式三: 实现Callable接口.
            需要结合线程池使用.

    开启线程的两个细节:
        1. 开启线程调用的是Thread#start()方法.
        2. 同一线程不能重复开启, 否则会报 IllegalThreadStateException(非法的线程状态异常).

    结论: 记忆
        多线程的执行具有随机性和延迟性, 原因是因为CPU在做着高效的切换.
 */
public class Demo02 {
    public static void main(String[] args) {
        //需求2: 打印100次 run, 通过自定义的线程类实现.
        //1. 创建线程对象.
        MyThread mt = new MyThread();
        //2. 开启线程.
        //mt.run();       //这样写不会报错, 但是只是普通的方法调用而已, 并没有开启线程.
        mt.start();
        //mt.start();    //同一线程不能重复开启, 否则会报 IllegalThreadStateException(非法的线程状态异常).


        //需求1: 打印100次 main
        for (int i = 0; i < 100; i++) {
            System.out.println("main..." + i);
        }

        //System.out    标准的输出流, 用来往控制台输出内容的.
        //System.err    标准的错误流, 用来打印异常信息的.
    }
}
